home *** CD-ROM | disk | FTP | other *** search
- ε Player de ficheros de Ondasπ
-
- Seguro que alguna vez te has preguntado como podia un PC reproducir las
- voces y los sonidos como si fuera una grabadora. Yo no voy a contestarte esa
- pregunta (si todavia no lo sabes) en este artículo, pero lo que sí haré será
- mostrarte como programar un reproductor de ondas para la Sound Blaster.
- Supongo que ya teneis un mínimo conocimiento de la tarjeta, de lo que es
- un fichero RAW de ondas y, por supuesto, de ensamblador. Un player de estas
- características puede programarse de varias formas, pero hoy solo veremos
- las 2 más usuales en C y assembler.
-
- ε Player mediante poolingπ
-
- La primera forma y más sencilla, no requiere el uso del DMA, simplemente
- se reprograma el "Γtimerπ" para que genere X interrupciones por segundo, donde
- X es la velocidad de sampleado que se usó al grabar la muestra (normalmente
- 11025, 22050 o 44100). A más interrupciones por segundo mayor calidad, pero
- también menos velocidad del ordenador (por lo que en una demo o juego no se
- puede usar). En realidad este sistema sólo se usa en programas donde se va
- reproduciendo un sample cada intervalo largo de tiempo a petición del usuario,
- y donde no pasa nada si el sistema se queda bloqueado hasta que finaliza el
- sonido (como en avisos de fallos del sistema; como Güindous).
- Para ilustrar este tipo de player he preparado un fichero en C tipo libreria
- donde se encuentran todas las funciones listas para ser usadas. Si tienes
- cualquier problema no dudes en escribirnos, pero creo que todo está muy, muy
- clarito... Una única cosa, si llamas a la función "ΓPLAY()π" cuando termine el
- sonido se repetirá una y otra vez hasta que llames a "ΓSTOP()π", mientras que
- si llamas a "ΓPLAY_Once()π" sólo se repetirá una vez.
-
- ε Player mediante DMAπ
-
- Ahora viene la chicha... Para que no os quejeis, el ejemplo más complicado
- os lo he hecho en assembler para que no tengais que calentaros la cabeza si
- no quereis. Se trata de un player ya preparado para funcionar que está
- internamente configurado para la ΓIRQ 7π (aunque no se usa), ΓDMA 1π (muy
- importante) y Γpuerto base 220hπ. Para cambiar estos valores por defecto, pue-
- des editar el fichero "φplay.incπ" y cambiarlos en la cabecera, pero no te ase-
- guro que te vayan a funcionar ya que no los he probado en ningún otra SB que
- no sea la mia. Seria muy recomendable que implementases una función para detec-
- tar que Γpuertoπ, ΓDMAπ y ΓIRQπ lleva la SB en el que se ejecutará el player
- (si no te aclaras enviame una e-mail o carta y veremos lo que se puede hacer).
- He dividido el programa en 2 ficheros para aislar las funciones de la SB y
- los datos del própio programa. Es de reseñar la sencillez de las 2 funciones
- que están implementadas en el fichero "φplay.asmπ", tanto "ΓLeeRAWπ" como la
- principal usan únicamente funciones del DOS (ficheros, memoria y salida) y
- las funciones implementadas en el otro fichero a excepción del
- ΓOUT 20h <- 20hπ que, como supondreis, se usa para indicar el final de una
- interrupción y que aquí sirve para resetear el controlador.
- En el fichero "φplay.incπ" nos encontramos con funciones interesantes como
- "ΓWriteDSPπ" con la que se escribe al ΓDSPπ (digital signal procesor) de la SB
- o "ΓResetSBπ". Mírate estas funciones ya que no las comentaré aquí pues están
- sobradamente comentadas en el fichero fuente.
- Vamos a centrarnos en la función "ΓPlayBufferπ" (observa que "ΓPlayRAWπ" lo
- único que hace es llamar a "ΓPlayBufferπ" después de meter en DS el segmento
- almacenado en FS, pero era interesante mantener la función ya que de cara a
- ampliar la libreria será necesario retocarla). Lo primero que se hace en
- "ΓPlayBufferπ" es calcular la dirección física del buffer y actualizar las
- variables usadas para controlar el ΓDMAπ.
- Seguidamente se reprograma el controlador de ΓDMAπ enviando los parámetros
- que habian sido calculados a partir del canal de ΓDMAπ a usar. Esta
- reprogramación termina cuando se envia el comando de habilitación de canal
- ΓDMAπ. Luego sigue una bifurcación que mira si se ha llamado anteriormente a
- la función (mediante la variable "Γvecesπ") y en caso negativo ejecuta una sé-
- rie de ordenes orientadas a la programación del ΓDSPπ para que acepte el modo
- de reproducción deseado (8 bits, mono/stereo). Luego se le envia el número de
- bytes por segundo a reproducir y se hace un acknowledge a la tarjeta. Antes
- de esto nos encontramos con un bucle que está inutilizado (con un punto y
- coma delante) que debia esperar hasta que el puerto de estatus del canal DMA
- que usemos indique la finalización (puede que se te cuelgue si le quitas el
- punto y coma).
-
- Como habrás observado no es tan dificil programar un reproductor de ficheros
- de ondas mediante pooling ni con el ΓDMAπ, pero si a pesar de todas estas
- explicaciones tienes algún problema, no dudes en hacermelo saber y trataré de
- despejarte todas las dudas. A partir de la base que aquí se ha presentado,
- se puede tratar de hacer un reproductor de ∞MODsπ sencillito o un piano con
- las teclas, etc. Si consigues programar algo interesante envianoslo y lo
- publicaremos.
-
- ∞Navi Dj.π
-